package com.example.mqttclient;

import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.mqttclient.mqtt.MqttService;
import org.eclipse.paho.client.mqttv3.MqttException;

// PubSubTestActivity类，继承自AppCompatActivity，实现了MqttService.MqttEventCallBack接口
// 用于实现基于MQTT协议的发布 - 订阅功能测试的Activity
public class PubSubTestActivity extends AppCompatActivity implements MqttService.MqttEventCallBack {

    // 用于输入发布主题的EditText
    private EditText topicPublish;
    // 用于输入订阅主题的EditText
    private EditText topicSubscribe;
    // 用于输入发布消息内容的EditText
    private EditText messagePublish;
    // 用于显示连接状态的TextView
    private TextView connectState;
    // 用于显示接收到消息的TextView
    private TextView messsageRecv;
    // MqttService的本地绑定对象，用于与MqttService交互
    private MqttService.MqttBinder mqttBinder;
    // 日志标签
    private String TAG = "PubSubTestActivity";
    // 记录上一次订阅的主题
    private String lastSubscribeTopic = null;

    // 定义ServiceConnection，用于与MqttService建立连接并处理连接相关事件
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        // 当与服务成功连接时调用
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            // 将传入的IBinder转换为MqttService.MqttBinder
            mqttBinder = (MqttService.MqttBinder) iBinder;
            // 设置当前Activity为MqttService的事件回调对象
            mqttBinder.setMqttEventCallback(PubSubTestActivity.this);
            // 根据连接状态更新连接状态TextView的文本
            if (mqttBinder.isConnected()) {
                connectState.setText("已连接");
            } else {
                connectState.setText("未连接");
            }
        }

        @Override
        // 当与服务断开连接时调用
        public void onServiceDisconnected(ComponentName componentName) {
            // 目前该方法为空实现，可根据需要添加断开连接后的处理逻辑
        }
    };

    @Override
    // Activity创建时调用的方法
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置Activity的布局为activity_pub_sub_test
        setContentView(R.layout.activity_pub_sub_test);
        // 通过id找到布局中用于输入发布主题的EditText
        topicPublish = findViewById(R.id.topic_publish_et);
        // 通过id找到布局中用于输入订阅主题的EditText
        topicSubscribe = findViewById(R.id.topic_sub_et);
        // 通过id找到布局中用于输入发布消息内容的EditText
        messagePublish = findViewById(R.id.message_publish_et);
        // 通过id找到布局中用于显示接收到消息的TextView
        messsageRecv = findViewById(R.id.message_recv_tv);
        // 通过id找到布局中用于显示连接状态的TextView
        connectState = findViewById(R.id.pubsub_connect_state);

        // 创建启动MqttService的Intent
        Intent mqttServiceIntent = new Intent(this, MqttService.class);
        // 绑定到MqttService，BIND_AUTO_CREATE表示如果服务不存在则自动创建
        bindService(mqttServiceIntent, connection, Context.BIND_AUTO_CREATE);


       findViewById(R.id.pubsub_publish_btn).setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               // 获取发布主题EditText中的文本
               String topic = topicPublish.getText().toString();
               // 检查主题是否为空
               if ("".equals(topic)) {
                   // 如果为空，显示提示Toast
                   Toast.makeText(PubSubTestActivity.this, "主题不能为空", Toast.LENGTH_SHORT).show();
                   return;
               }
               try {
                   // 通过mqttBinder调用发布消息方法，发布消息到指定主题
                   mqttBinder.publishMessage(topic, messagePublish.getText().toString());
               } catch (MqttException e) {
                   // 捕获发布消息过程中的MqttException并打印堆栈信息
                   e.printStackTrace();
               }
           }
       });

        findViewById(R.id.pubsub_ubscribe_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 调用订阅新主题的方法
                subscribeNewTopic();
            }
        });
    }

    // 订阅新主题的方法
    void subscribeNewTopic() {
        // 获取订阅主题EditText中的文本
        String topic = topicSubscribe.getText().toString();
        // 检查主题是否为空
        if ("".equals(topic)) {
            // 如果为空，显示提示Toast
            Toast.makeText(PubSubTestActivity.this, "主题不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        // 如果存在上一次订阅的主题
        if (lastSubscribeTopic != null) {
            try {
                // 先取消订阅上一次的主题
                mqttBinder.unSubscribe(lastSubscribeTopic);
            } catch (MqttException e) {
                // 捕获取消订阅过程中的MqttException并打印堆栈信息
                e.printStackTrace();
            }
            lastSubscribeTopic = null;
        }
        try {
            // 订阅新的主题
            mqttBinder.subscribe(topic);
            // 更新记录的上一次订阅主题
            lastSubscribeTopic = topic;
            // 显示订阅成功的Toast
            Toast.makeText(PubSubTestActivity.this, "订阅成功", Toast.LENGTH_SHORT).show();
        } catch (MqttException e) {
            // 捕获订阅过程中的MqttException并打印堆栈信息
            e.printStackTrace();
        }
    }

    @Override
    // 当与MQTT服务器连接成功时，MqttService回调此方法
    public void onConnectSuccess() {
        // 更新连接状态TextView的文本为已连接
        connectState.setText("已连接");
    }

    @Override
    // 当与MQTT服务器连接出错时，MqttService回调此方法，error为错误信息
    public void onConnectError(String error) {
        Log.d(TAG, "onConnectError: " + error);
        // 更新连接状态TextView的文本为未连接
        connectState.setText("已连接");
        // 清空上一次订阅的主题记录
        lastSubscribeTopic = null;
    }

    @Override
    // 当消息发布完成时，MqttService回调此方法
    public void onDeliveryComplete() {
        Log.d(TAG, "publish ok");
    }

    @Override
    // 当接收到MQTT消息时，MqttService回调此方法，topic为消息主题，message为消息内容
    public void onMqttMessage(String topic, String message) {
        // 更新显示接收到消息的TextView文本
        messsageRecv.setText("topic:" + topic + ", message:" + message);
    }

    @Override
    // Activity销毁时调用的方法
    protected void onDestroy() {
        // 解除与MqttService的绑定
        unbindService(connection);
        super.onDestroy();
    }
}